\section{bibliothèque}

Notre bibliothèque \textit{thread} comporte quatre fonctions importantes:
        ~\\
\begin{itemize}
\item \textbf{thread\_create} :
        ~\\
		Cette fonction a pour rôle de créer un nouveau thread, en le plaçant par défaut dans la \textit{runqueue} avec une priorité de 20 et un statut READY. 

        ~\\

\item \textbf{thread\_yield} :
        ~\\
		La fonction thread\_yield signifie au thread courant qu'il passe la main au thread en tête de la liste des threads en attente. Il s'agit d'un simple remplacement.

        ~\\
       
\item \textbf{thread\_join} :
        ~\\
        La fonction thread\_join permet au thread courant d'attendre la fin d'exécution d'un thread. Elle est aussi utilisé dans le cas où un thread nécessite la valeur de retour d'un autre thread.\\
        
        Pour que l'ordonnanceur puisse réveiller facilement le joineur d'un thread, on se limite au cas où il y a au plus un joineur pour chaque thread. Il est donc naturel d'avoir un champ "joiner" dans la structure de thread. Ce champ est affecté par le thread courant lorsque ce dernier appelle la fonction "thread\_join". Avant qu'un thread se termine, il doit réveiller son "joiner", et eventuellement lui passer la valeur de retour.\\

        Cette fonction a aussi pour rôle de libérer à la fin de la fonction les ressources du thread qui a été passé comme paramètre.

        ~\\
\item \textbf{thread\_exit} :
        ~\\
        Cette fonction a pour but de terminer un thread. Mais avant de le tuer, un thread doit réveiller son joiner s'il existe et le passer éventuellement la valeur de retour. Cette fonction doit normalement être appelé par tous les threads à la fin de leur exécution. \\

        Après avoir observé la fonctionnement de la bibliothèque \textit{pthread}, nous voyons que l'appel de cette fonction peut être omis. Pour ce faire, on génère un contexte particulier qui exécute la fonction "thread\_exit". Le champ \textit{uc\_link} du contexte de chaque thread pointe vers ce contexte afin que ce dernier puisse s'exécuter automatiquement.\\

        Si l'utilisateur a appelé \textbf{thread\_exit}, le thread courant est donc dans l'état zombie. Après le \textit{swapcontext}, le système ne repasse jamais à ce thread, donc le context pointé par \textit{uc\_link} ne éxecutera jamais. Cela correspond bien ce que nous voulons.

\end{itemize}
